package com.liyong.pullorder.sdk.parser;

import com.liyong.pullorder.sdk.autoconfigure.PullOrderSdkProperties;
import com.liyong.pullorder.sdk.dto.StandardOrderDto;
import com.liyong.pullorder.sdk.exception.DataParseException;

import java.util.List;

/**
 * @author 葡萄味的萝卜
 * @date 2025/10/21 12:13
 * 数据解析策略接口
 * 核心作用：统一解析不同平台返回的XML/JSON格式订单数据
 * 设计目标：通过策略模式实现多格式支持，完成标准化数据清洗
 *
 * 解析流程：
 * 1. 原始数据解析 - 将平台返回数据解析为中间对象
 * 2. 数据清洗 - 处理空值、格式转换、数据校验
 * 3. 标准转换 - 转换为统一标准订单DTO
 * 4. 质量检查 - 数据完整性验证
 *
 * 已支持格式：
 * - JSON：现代API平台主流格式
 * - XML：传统ERP系统常用格式
 */
public interface ParserStrategy {
    /**
     * 获取支持的解析格式
     * 用于自动路由：根据平台配置选择对应的解析器
     */
    String getSupportedFormat();

    /**
     * 检查是否支持指定数据格式
     * 实现解析器的自动发现和选择
     */
    boolean supports(String dataFormat);

    /**
     * 解析原始数据为标准订单列表
     * 核心解析逻辑：完成从平台特定格式到标准格式的转换
     *
     * @param rawData 平台返回的原始数据（JSON/XML字符串）
     * @param platformConfig 平台配置（包含字段映射规则等）
     * @return 标准化订单列表，为下游系统提供洁净数据源
     * @throws DataParseException 解析失败时抛出，触发重试机制
     */
    List<StandardOrderDto> parse(String rawData,
                                 PullOrderSdkProperties.PlatformConfig platformConfig);

    /**
     * 数据清洗和验证
     * 保障数据质量：处理空值、格式标准化、业务规则校验
     *
     * @param orders 解析后的订单列表
     * @return 经过清洗的标准化订单列表
     */
    List<StandardOrderDto> cleanAndValidate(List<StandardOrderDto> orders);
}
